/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package jsyntaxpane.actions; import java.awt.event.ActionEvent; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.text.JTextComponent; import jsyntaxpane.SyntaxDocument; import jsyntaxpane.util.Configuration; /** * Executes the script in the component's text using a ScriptEngine * The Configuration must contain the key [prefix.]ACTION_NAME.ScriptExtension * and its value is the ScriptExtension that getEngineByExtension returns * If no engine is found, then an option is given to the user to disable the action * * @author Ayman Al-Sairafi */ public class ScriptRunnerAction extends DefaultSyntaxAction { public ScriptRunnerAction() { super("SCRIPT_EXECUTE"); } @Override public void actionPerformed(JTextComponent target, SyntaxDocument sDoc, int dot, ActionEvent e) { try { ScriptEngine eng = getEngine(target); if (eng != null) { getEngine(target).eval(target.getText()); } } catch (ScriptException ex) { JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(target), "Error executing script:\n" + ex.getMessage(), "Script Error", JOptionPane.ERROR_MESSAGE); ActionUtils.setCaretPosition(target, ex.getLineNumber(), ex.getColumnNumber()); } } private ScriptEngine getEngine(JTextComponent target) { if (engine == null) { if (sem == null) { sem = new ScriptEngineManager(); } engine = sem.getEngineByExtension(scriptExtension); } if (engine == null) { int result = JOptionPane.showOptionDialog(target, "Script Engine for [" + scriptExtension + "] not found. Disable this Action?", "jsyntaxpane", JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null); if (result == JOptionPane.YES_OPTION) { setEnabled(false); } } return engine; } @Override public void config(Configuration config, String name) { scriptExtension = config.getString(name + ".ScriptExtension"); } protected static ScriptEngineManager sem; private ScriptEngine engine; private String scriptExtension; }